﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ControlCenter.通讯;

namespace 转发程序
{
    /// <summary>
    /// 联接对像
    /// </summary>
    public class 联接对像
    {


        ///<summary>
        ///创建一个新的联接对像
        /// </summary>
        /// <param name="接入联接">接入的联接TCP对像</param>
        /// <param name="转发目标集合">转发目标集合</param>
        public 联接对像(TcpServerSocket 接入联接, System.Collections.Generic.IEnumerable<转发目标> 转发目标集合)
        {
            this.接入联接 = 接入联接;
            this.转发目标集合 = 转发目标集合.ToDictionary(p => p.目标IP + "|" + p.目标端口);
        }

        ///<summary>
        ///创建一个新的联接对像
        /// </summary>
        /// <param name="接入联接">接入的联接TCP对像</param>
        /// <param name="转发目标集合">转发目标</param>
        public 联接对像(TcpServerSocket 接入联接, 转发目标 转发目标)
        {
            this.接入联接 = 接入联接;

            转发目标集合 = new Dictionary<string, 转发目标>()
            {
                {转发目标.目标IP+"|"+转发目标.目标端口,转发目标}
            };


        }
        /// <summary>
        /// 表示从别的服务器转发过来的联接
        /// </summary>
        public TcpServerSocket 接入联接
        {
            get;
            set;
        }

        /// <summary>
        /// 这个接入的联接要转发出去的目标集合
        /// </summary>
        public System.Collections.Generic.Dictionary<string, 转发目标> 转发目标集合
        {
            get;
            set;
        }

        /// <summary>
        /// 关闭联接 所有转发目标已经存在的联接
        /// </summary>
        public void Close()
        {
            try
            {
                接入联接.Socket.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                接入联接.Socket.Close();
                接入联接.Socket.Dispose();
            }
            catch
            {

            }
            foreach (转发目标 目标 in 转发目标集合.Values)
            {
                try
                {
                    try
                    {
                        目标.目标机通讯Socket.Socket.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                    }
                    catch { }

                    目标.目标机通讯Socket.Socket.Close();
                    接入联接.Socket.Dispose();
                }
                catch
                {

                }
            }
        }
    }
}
